import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入路由配置信息
import routes from './routes'
import store from '@/store'
import {
    reqGetUserInfo
} from '@/api'

Vue.use(VueRouter)


// 重写push和replace方法,解决路由跳转多次点击是触发的navigation报错
// 首先备份原来的push和replace
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        // call和apply的异同
        // 同：都可以调用函数一次，都可以篡改函数上下文一次
        // 异：call传递参数用逗号隔开，apply传递参数需要数组
        originPush.call(this, location, resolve, reject)

    } else {
        originPush.call(this, location, () => {}, () => {})
    }
};

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => {}, () => {})
    }
}

const router = new VueRouter({
    //将路由信息单独摘出去，避免代码过多造成混乱
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        return {
            y: 200
        }
    },
})

// 挂载路由导航守卫
router.beforeEach(async (to, from, next) => {
    let token = store.state.register.token
    // 这里不能用userInfo=store.state.register.userInfo,因为userinfo是个空对象，在判断的时候为true
    let name = store.state.register.userInfo.name
    if (token) {
        if (to.path == '/login') {
            next('/')
        } else {
            if (name) {
                // 如果有用户信息，就放行
                next()
            } else {
                // 如果没有用户信息，就派发action获取用户信息
                try {
                    let result = await store.dispatch('getUserInfo')
                    //    console.log(result)
                    next()
                } catch (error) {
                    // token失效了获取不到用户信息，从新登录
                    // 清除token
                    await store.dispatch('logout')
                    next('/login')
                }
            }
        }
    } else {
        //   如果用户未登录，不能去交易相关的和支付相关的组件
        let toPath = to.path

        if (toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1 || toPath.indexOf('/trade') !== -1) {
            // 将用于想去的地方，但是没有登录去不了的地方存储再路由中，以便登录后可以直接跳转到想去的地方
            next('/login?redirect=' + toPath)
        } else {
            next()
        }
    }

})

export default router